/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Threads;

import Monitores.MonitorValoresBdToPDF;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.PageSize;
import com.lowagie.text.pdf.DefaultFontMapper;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import utilidades.ConstructorQuery;
import utilidades.GestorBD;

/**
 * Thread que coge valores del MonitorValoresBdToPDF, y con dichos datos
 * crea una query para obtener información de BD para crea un PDF con una
 * grafica representativa de dichos datos.
 * @author felipe
 */
public class ThreadEscrituraPDF implements Runnable {

    private final MonitorValoresBdToPDF monitorValoresBdToPDF;
    private ArrayList<Float> cierres;
    private ArrayList<String> fechas;
    private final GestorBD conexion;
    private final ConstructorQuery constructor_Query;
    private boolean flag;

    public ThreadEscrituraPDF(MonitorValoresBdToPDF monitorValoresBdToPDF) {
        this.monitorValoresBdToPDF = monitorValoresBdToPDF;
        this.conexion = new GestorBD();
        this.constructor_Query = new ConstructorQuery();
        this.flag = true;
    }

    @Override
    public void run() {
        while (flag) {
            String lineaPDF = monitorValoresBdToPDF.getValor();
            if (lineaPDF != null) {
                try {
                    String[] linea = lineaPDF.split(",");
                    //OBTENER CIERRES Y FECHAS
                    conexion.abrir();
                    cierres = conexion.obtenerResultadoDelSelectCierreEnArray(
                            constructor_Query.constructorQuerySelectCierre(lineaPDF));
                    fechas = conexion.obtenerResultadoDelSelectFechaEnArray(
                            constructor_Query.constructorQuerySelectFecha(lineaPDF));
                    //ESCRIBIR EN PDF
                    imprimirChartAPDF(crearGrafico(), "/home/felipe/NetBeansProjects/YahooFinances/PDF/" + linea[0] + ".pdf");
                } finally {
                    conexion.cerrar();
                }
            } else {
                flag = false;
            }
        }
    }

    /**
     * Dado un JFreeChart y el nombre de un fichero que generara, imprime un PDF
     * con el grafico obtenido del JFreeChart.
     * @param chart
     * @param fileName 
     */
    private static void imprimirChartAPDF(JFreeChart chart, String fileName) {
        PdfWriter writer = null;
        Document document = new Document(PageSize.A3.rotate());
        float width = document.getPageSize().getWidth();
        float height = document.getPageSize().getHeight();
        try {
            writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
            document.open();
            PdfContentByte contentByte = writer.getDirectContent();
            PdfTemplate template = contentByte.createTemplate(width, height);
            Graphics2D graphics2d = template.createGraphics(width, height, new DefaultFontMapper());
            Rectangle2D rectangle2d = new Rectangle2D.Double(0, 0, width, height);
            chart.draw(graphics2d, rectangle2d);
            graphics2d.dispose();
            contentByte.addTemplate(template, 0, 0);
        } catch (DocumentException ex) {
            Logger.getLogger(ThreadEscrituraPDF.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException e) {
            System.out.println("Pdf no disponible" + e);
        }
        document.close();
    }

    /**
     * Crea un JFreeChart.
     * @return 
     */
    private JFreeChart crearGrafico() {
        DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
        int cantidad = cierres.size();

        JFreeChart chart = ChartFactory.createLineChart("", "Fecha", "Valor de Cierre",
                dataSet, PlotOrientation.VERTICAL, false, true, false);

        CategoryPlot cPlot = chart.getCategoryPlot();
        cPlot.setBackgroundPaint(Color.BLACK);
        cPlot.setRangeGridlinePaint(Color.GREEN);

        CategoryAxis cAxis = cPlot.getDomainAxis();
        if (cierres.size() > 70) {
            cAxis.setTickLabelFont(new Font("Arial", Font.TYPE1_FONT, 8));
        }
        cAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);

        for (int i = 0; i < cantidad; i++) {
            if (i % 3 != 0) {
                cAxis.setTickLabelPaint(fechas.get(i), new Color(0, true));
            }
            dataSet.setValue(cierres.get(i), "Cierre", fechas.get(i));
        }
        return chart;
    }
}